package servico;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import persistencia.dao.GenericDAO;
import persistencia.entidades.Agenda;
import persistencia.entidades.Atendente;
import persistencia.entidades.Paciente;

/**
 * Classe de serviço especializada em funções relacionadas a entidade Agenda.
 * 
 * @autho Maciel Melo
 * @since 20/11/2013
 */
@SuppressWarnings("javadoc")
public class AgendaService {

	private final GenericDAO<Agenda> daoAgenda;
	private final GenericDAO<Paciente> daoPaciente;
	private final GenericDAO<Atendente> daoAtendente;

	public AgendaService() {
		this.daoAgenda = new GenericDAO<Agenda>();
		this.daoPaciente = new GenericDAO<Paciente>();
		this.daoAtendente = new GenericDAO<Atendente>();
	}

	/**
	 * construtor para fins de testes unitários.
	 */
	public AgendaService(GenericDAO<Agenda> daoAgenda,
			GenericDAO<Paciente> daoPaciente, GenericDAO<Atendente> daoAtendente) {
		super();
		this.daoAgenda = daoAgenda;
		this.daoPaciente = daoPaciente;
		this.daoAtendente = daoAtendente;
	}

	/* CRUD */

	public List<Agenda> buscarTodos() {
		return daoAgenda.findAll(Agenda.class, true);
	}

	public List<Agenda> buscarPorPaciente(Paciente paciente) {
		paciente = daoPaciente.findById(Paciente.class, paciente.getId(), true);
		return paciente.getAgendas();

	}

	public List<Agenda> buscarPorAtendente(Atendente atendente) {
		atendente = daoAtendente.findById(Atendente.class, atendente.getId(),
				true);
		return atendente.getAgenda();
	}

	public List<Agenda> buscarPorDataAtual() {
		return buscarPorDia(Calendar.getInstance());
	}

	@SuppressWarnings("deprecation")
	public List<Agenda> buscarPorDia(Calendar date) {
		List<Agenda> todas = buscarTodos();
		List<Agenda> dia = new ArrayList<Agenda>();
		Calendar agendaDate;
		for (Agenda agenda : todas) {
			agendaDate = agenda.getDate();

			// Mesmo dia, mes e ano;
			if (date.get(Calendar.MONTH) == agendaDate.get(Calendar.MONTH)
					&& date.get(Calendar.MONTH) == agendaDate
							.get(Calendar.MONTH)
					&& date.get(Calendar.YEAR) == agendaDate.get(Calendar.YEAR)) {
				dia.add(agenda);
			}
		}

		return dia;
	}

	public Agenda buscarPorId(Agenda agenda) {
		return daoAgenda.findById(Agenda.class, agenda.getId(), true);
	}
}
